package design.pattern.singleton.lazy;

/**
 * @description: 双重检查锁单例模式
 * @author: liuzhangcheng
 **/
public class LazyDoubleCheckSingleton {
    private static LazyDoubleCheckSingleton singleton;

    private LazyDoubleCheckSingleton() {
    }

    public static LazyDoubleCheckSingleton getInstance() {
        // 双重检查1
        if (singleton == null) {
            // 同步，阻塞并不是基于整个 LazyDoubleCheckSingleton 类的阻塞，而是在 getInstance() 方法内部阻塞，只要逻辑不是太复杂，对于调用者而言感知不到
            synchronized (LazyDoubleCheckSingleton.class) {
                // 双重检查2
                if (singleton == null) {
                    singleton = new LazyDoubleCheckSingleton();
                    // 内存分配步骤：
                    // 1.分配内存给这个对象
                    // 2.初始化对象
                    // 3.设置 singleton 指向刚分配的内存地址
                }
            }
        }
        return singleton;
    }
}
